#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CSV to JSON Data Converter
将CSV文件转换为JSON格式的点数据
"""

import csv
import json
import sys
import os
import re
from typing import List, Dict, Any


def parse_chinese_date(date_str: str) -> str:
    """
    解析中文日期格式，如"1930年12月30日"
    
    Args:
        date_str: 中文日期字符串
    
    Returns:
        标准ISO日期格式字符串，如"1930-12-30"
    """
    if not date_str:
        return ""
    
    # 匹配中文日期格式：年月日
    pattern = r'(\d{4})年(\d{1,2})月(\d{1,2})日'
    match = re.match(pattern, date_str.strip())
    
    if match:
        year, month, day = match.groups()
        # 格式化为标准日期格式，确保月和日是两位数
        return f"{year}-{month.zfill(2)}-{day.zfill(2)}"
    else:
        # 如果不匹配，尝试其他可能的格式
        # 匹配只有年月的格式：1930年12月
        pattern_year_month = r'(\d{4})年(\d{1,2})月'
        match_year_month = re.match(pattern_year_month, date_str.strip())
        
        if match_year_month:
            year, month = match_year_month.groups()
            # 默认设置为该月的第一天
            return f"{year}-{month.zfill(2)}-01"
        else:
            # 匹配只有年的格式：1930年
            pattern_year = r'(\d{4})年'
            match_year = re.match(pattern_year, date_str.strip())
            
            if match_year:
                year = match_year.group(1)
                # 默认设置为该年的1月1日
                return f"{year}-01-01"
            else:
                # 如果都不匹配，返回原始字符串
                print(f"警告: 无法解析日期格式: {date_str}")
                return date_str.strip()


def csv_to_json_data(csv_file_path: str, output_file_path: str = None) -> str:
    """
    将CSV文件转换为JSON格式的点数据
    
    Args:
        csv_file_path: CSV文件路径
        output_file_path: 输出文件路径（可选，默认为同名.json文件）
    
    Returns:
        转换后的JSON字符串
    """
    
    # 检查文件是否存在
    if not os.path.exists(csv_file_path):
        raise FileNotFoundError(f"CSV文件不存在: {csv_file_path}")
    
    # 如果没有指定输出文件路径，使用同名.json文件
    if output_file_path is None:
        base_name = os.path.splitext(csv_file_path)[0]
        output_file_path = f"{base_name}.json"
    
    points_data = []
    
    try:
        with open(csv_file_path, 'r', encoding='utf-8') as file:
            # 读取CSV文件
            csv_reader = csv.DictReader(file)
            
            # 验证表头
            expected_headers = ['序号', '时间', '地点', '事件', '纬度', '经度']
            if list(csv_reader.fieldnames) != expected_headers:
                print(f"警告: CSV表头不匹配")
                print(f"期望的表头: {expected_headers}")
                print(f"实际的表头: {list(csv_reader.fieldnames)}")
            
            # 处理每一行数据
            for row_num, row in enumerate(csv_reader, start=2):
                try:
                    # 数据验证和转换
                    latitude = float(row['纬度']) if row['纬度'] else 0.0
                    longitude = float(row['经度']) if row['经度'] else 0.0
                    
                    point_data = {
                        "longitude": longitude,
                        "latitude": latitude,
                        "time": parse_chinese_date(row['时间']) if row['时间'] else "",
                        "hoverContent": row['事件'].strip() if row['事件'] else "",
                        "location": row['地点'].strip() if row['地点'] else ""
                    }
                    
                    points_data.append(point_data)
                    
                except (ValueError, TypeError) as e:
                    print(f"警告: 第{row_num}行数据有问题，跳过该行: {e}")
                    continue
    
    except UnicodeDecodeError:
        # 如果UTF-8解码失败，尝试GBK
        try:
            with open(csv_file_path, 'r', encoding='gbk') as file:
                csv_reader = csv.DictReader(file)
                
                for row_num, row in enumerate(csv_reader, start=2):
                    try:
                        latitude = float(row['纬度']) if row['纬度'] else 0.0
                        longitude = float(row['经度']) if row['经度'] else 0.0
                        
                        point_data = {
                            "longitude": longitude,
                            "latitude": latitude,
                            "time": parse_chinese_date(row['时间']) if row['时间'] else "",
                            "hoverContent": row['事件'].strip() if row['事件'] else "",
                            "location": row['地点'].strip() if row['地点'] else ""
                        }
                        
                        points_data.append(point_data)
                        
                    except (ValueError, TypeError) as e:
                        print(f"警告: 第{row_num}行数据有问题，跳过该行: {e}")
                        continue
        except Exception as e:
            raise Exception(f"读取CSV文件失败: {e}")
    
    # 将数据转换为JSON格式
    json_data = json.dumps(points_data, ensure_ascii=False, indent=2)
    
    # 写入文件
    with open(output_file_path, 'w', encoding='utf-8') as output_file:
        output_file.write(json_data)
    
    print(f"成功转换 {len(points_data)} 条数据记录")
    print(f"已生成JSON文件: {output_file_path}")
    
    return json_data


def main():
    """主函数"""
    
    # 检查命令行参数
    if len(sys.argv) < 2:
        print("用法: python csv_to_react_data.py <csv_file_path> [output_file_path]")
        print("示例: python csv_to_react_data.py data.csv")
        print("示例: python csv_to_react_data.py data.csv points_data.json")
        sys.exit(1)
    
    csv_file_path = sys.argv[1]
    output_file_path = sys.argv[2] if len(sys.argv) > 2 else None
    
    try:
        # 转换CSV文件
        csv_to_json_data(csv_file_path, output_file_path)
        
    except Exception as e:
        print(f"转换失败: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main() 